library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.4     ✓ stringr 1.4.0
## ✓ readr   2.1.1     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(dplyr)
library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Attaching package: 'arules'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
library(sjstats)
library(ggplot2)
library(R.matlab)
## R.matlab v3.6.2 (2018-09-26) successfully loaded. See ?R.matlab for help.
## 
## Attaching package: 'R.matlab'
## The following objects are masked from 'package:base':
## 
##     getOption, isOpen
library(ISLR)
library(ggsci)
library(hrbrthemes)
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
##       Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
##       if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
df = ISLR::Carseats
head(df)
##   Sales CompPrice Income Advertising Population Price ShelveLoc Age Education
## 1  9.50       138     73          11        276   120       Bad  42        17
## 2 11.22       111     48          16        260    83      Good  65        10
## 3 10.06       113     35          10        269    80    Medium  59        12
## 4  7.40       117    100           4        466    97    Medium  55        14
## 5  4.15       141     64           3        340   128       Bad  38        13
## 6 10.81       124    113          13        501    72       Bad  78        16
##   Urban  US
## 1   Yes Yes
## 2   Yes Yes
## 3   Yes Yes
## 4   Yes Yes
## 5   Yes  No
## 6    No Yes
# Display Structure of Data Frame.
str(df)
## 'data.frame':    400 obs. of  11 variables:
##  $ Sales      : num  9.5 11.22 10.06 7.4 4.15 ...
##  $ CompPrice  : num  138 111 113 117 141 124 115 136 132 132 ...
##  $ Income     : num  73 48 35 100 64 113 105 81 110 113 ...
##  $ Advertising: num  11 16 10 4 3 13 0 15 0 0 ...
##  $ Population : num  276 260 269 466 340 501 45 425 108 131 ...
##  $ Price      : num  120 83 80 97 128 72 108 120 124 124 ...
##  $ ShelveLoc  : Factor w/ 3 levels "Bad","Good","Medium": 1 2 3 3 1 1 3 2 3 3 ...
##  $ Age        : num  42 65 59 55 38 78 71 67 76 76 ...
##  $ Education  : num  17 10 12 14 13 16 15 10 10 17 ...
##  $ Urban      : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 2 2 1 1 ...
##  $ US         : Factor w/ 2 levels "No","Yes": 2 2 2 2 1 2 1 2 1 2 ...
# Check nulls per variable.
lapply(df,function(x) { length(which(is.na(x)))})
## $Sales
## [1] 0
## 
## $CompPrice
## [1] 0
## 
## $Income
## [1] 0
## 
## $Advertising
## [1] 0
## 
## $Population
## [1] 0
## 
## $Price
## [1] 0
## 
## $ShelveLoc
## [1] 0
## 
## $Age
## [1] 0
## 
## $Education
## [1] 0
## 
## $Urban
## [1] 0
## 
## $US
## [1] 0

Las variables no tienen valores nulos.

# Select just numerical features
nums <- unlist(lapply(df, is.numeric))

for (var in names(df[, nums])) {
  print(var)
  print(summary(df[,c(var)]))
  boxplot(df[,c(var)], main = paste0(var," boxplot"))
}
## [1] "Sales"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   5.390   7.490   7.496   9.320  16.270

## [1] "CompPrice"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      77     115     125     125     135     175

## [1] "Income"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   42.75   69.00   68.66   91.00  120.00

## [1] "Advertising"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   5.000   6.635  12.000  29.000

## [1] "Population"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    10.0   139.0   272.0   264.8   398.5   509.0

## [1] "Price"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    24.0   100.0   117.0   115.8   131.0   191.0

## [1] "Age"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   25.00   39.75   54.50   53.32   66.00   80.00

## [1] "Education"
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    10.0    12.0    14.0    13.9    16.0    18.0

# Select just categorical features
cat <- unlist(lapply(df, is.factor))

for (var in names(df[, cat])) {
  print(var)
  print(table(df[,c(var)]))
  print(round(prop.table(table(df[,c(var)])),2))
}
## [1] "ShelveLoc"
## 
##    Bad   Good Medium 
##     96     85    219 
## 
##    Bad   Good Medium 
##   0.24   0.21   0.55 
## [1] "Urban"
## 
##  No Yes 
## 118 282 
## 
##  No Yes 
## 0.3 0.7 
## [1] "US"
## 
##  No Yes 
## 142 258 
## 
##   No  Yes 
## 0.36 0.64

Hay el doble más de tiendas con asientos de coches en el estante medio que tiendas con asientos de coches en el estante malo o bueno.

El 30% de las tiendas están en zona rural.

El 36% de las tiendas no están en US.

# New variable with ages by interval
df$Age_cat <- cut(df$Age, breaks = c(25,30,35,40,45,65,80),
      labels = c("25-30","30-35","35-40","40-45","45-65","65-80"),
      include.lowest = TRUE)
# New variable with sales classified as low, medium, high and very high
df$Sales_cat <- cut(df$Sales, breaks = c(0,5.39,7.49,9.32,16.27), labels = c("bajas", "medias","altas","muy altas"),include.lowest = TRUE)

# New variable with the price difference between the stores and their competencies in absolute value
df$diff_price <- abs(df$Price - df$CompPrice)

Análisis de la variable precio

¿A mayor precio mayor precio de la competencia?

plot(x = df$Price, y = df$CompPrice, main="Price VS CompPrice", xlab="Price",ylab="Competence Price", col = alpha("black", 0.5), pch = 19)

Hay una clara correlación entre el precio de la tienda y el de su competencia.

La distribución del precio del asiento del coche según las ventas en las tiendas sean altas, medias o bajas.

ggplot(df, aes(x=Sales_cat, y=Price)) + 
    geom_boxplot() + theme_ipsum() +
    labs(title = "Sales level price distribution", x ="Level Sales", y = "Price")

El precio del asiento del coche está correlacionado negativamente con las ventas: a menores ventas el precio es más alto.

¿Es el precio de los asientos de coches muy distinto en tiendas con ventas bajas en zona rural y urbana?

ggplot(df, aes(x=Sales_cat, y=Price, color=Urban)) + scale_color_brewer(palette = "Paired") +
    geom_boxplot() + theme_ipsum() + labs(title = "Sales level price distribution by area", x ="Level Sales", y = "Price")

El precio del asiento del coche está correlacionado negativamente con las ventas en las zonas urbanas. Sin embargo, en zonas rurales, las ventas de categoría media son algo más altas que las ventas de categoría baja.

¿A más precio, la diferencia entre el precio del asiento del coche y el de la competencia, es menor?

ggplot(df, aes(x=Price, y=diff_price)) + 
    geom_point(
        fill="black",
        shape=21,
        alpha=0.5,
        size=3
        ) + theme_ipsum() + labs(title = "Price VS Price difference between shops and competition", x ="Price", y = "Price difference between shops and competition")

Hay una tendencia a que cuanto mayor es el precio menor es la diferencia de precio del asiento del coche con la competencia.

¿Cómo se distribuye la diferencia entre el precio del asiento del coche y el precio de la competencia?

boxplot(df$diff_price, main = "Car seat price difference between shops and competition")

summary(df$diff_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    7.75   14.00   17.07   25.00   57.00

3/4 partes tienen una diferencia entre el precio del asiento del coche y el precio de la competencia de 25 dólares o menos.

¿El precio de la competencia es mayor si es mayor el precio del asiento del coche en la tienda?

plot(x=df$Price, y=df$CompPrice, main
     = "Price VS CompPrice", ylab = "Competence Price", xlab = "Price", col = alpha("black", 0.5), pch = 19)

Hay una correlación positiva entre el precio del asiento del coche en la tienda y el precio de su competencia.

¿A más ingresos la diferencia entre el precio del asiento del cocche y el de la competencia es menor?

ggplot(df, aes(x=Price, y=diff_price, size=Income,color=Income)) + 
    geom_point(alpha=0.5) + theme_ipsum() + scale_color_gradient(low = "#FF410DFF", high = "#6EE2FFFF") +
    labs(title = "Price difference with the competition VS Price VS Income", x ="Price", y = "Price difference with the competition")

df$highlow_income <- ifelse(df$Income >= 91, "high_income","nothigh_income")
ggplot(df, aes(x=Price, y=CompPrice, color=highlow_income)) + 
    geom_point(size=3,alpha=0.7) + theme_ipsum() + scale_color_brewer(palette = "Paired") +
    labs(title = "Competition price VS Price VS Income", x ="Price", y = "Competition price")

No hay correlación entre los diferentes ingresos y el precio y la diferencia de precio del asiento del coche con la competencia.

Análisis de la variable ventas

¿Las ventas en dólares son más cuanto más son las unidades vendidas?

plot(x=df$Price, y=df$Sales, main = "Price VS Sales",  ylab = "Sales", xlab = "Price", col = alpha("black", 0.5), pch = 19)

Hay una clara relación entre precio y ventas.

A mayor precio hay una tendencia a vender menos asientos de los coches.

plot(x=df$Price * df$Sales, y=df$Sales, main = "Sales Money VS Sales Quantity",  ylab = "Sales Quantity", xlab = "Sales Money", col = alpha("black", 0.5), pch = 19)

A más ventas más dinero.

¿Más ventas a más población?

plot(x=df$Price * df$Sales, y=df$Population, main = "Sales Money VS Population", ylab = "Population", xlab = "Sales Money", col = alpha("black", 0.5), pch = 19)

No hay una correlación entre el número de habitantes y las ventas en dinero.

¿Hay ventas más altas si hay más ingresos de la comunidad?

plot(x = df$Sales_cat, y = df$Income, main="Sales categories VS Income", xlab="Sales categories",ylab="Income")

Hay una clara relación entre las tiendas con ventas muy altas y el ingreso de la comunidad. A más ventas el ingreso de la comunidad es también mayor, y viceversa.

Nivel de ventas por ingreso y zona

ggplot(df, aes(x=Sales_cat, y=Income, color=Urban)) + scale_color_brewer(palette = "Paired") +
    geom_boxplot() + theme_ipsum() + labs(title = "Income distribution by sales level and area", x ="Level Sales", y = "Income")

Las tiendas con ventas bajas que están en zona rural tienen, por lo general, clientes con menos ingresos económicos que las tiendas en zonas urbanas.

Las tiendas con ventas medias que están en zona rural tienen, por lo general, clientes con menos ingresos económicos que las tiendas en zonas urbanas.

Las tiendas con ventas muy altas que están en zona rural tienen, por lo general, clientes con menos ingresos económicos que las tiendas en zonas urbanas.

Las tiendas con ventas altas que están en zona rural tienen, por lo general, clientes con mayores ingresos económicos que las tiendas en zonas urbanas.

De las ventas totales en cada zona, ¿Hay mayor porcentaje de ventas rurales o urbanas según las ventas sean bajas, medias, altas o muy altas?

summary(df$Sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   5.390   7.490   7.496   9.320  16.270
df_sales_urban <- df %>% group_by(Sales_cat, Urban) %>% summarise(n = n(), .groups = 'drop')
df_sales_urban$per_sales_urban <- ifelse(df_sales_urban$Urban == "Yes",round(df_sales_urban$n/sum(df$Urban == "Yes"),2),round(df_sales_urban$n/sum(df$Urban == "No"),2))

ggplot(df_sales_urban, aes(fill=Urban,x=Sales_cat,y=per_sales_urban)) + 
  geom_bar(stat= "identity", position=position_dodge()) +
  theme_ipsum() + scale_fill_brewer(palette = "Paired") +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=0.5)) + 
  geom_text(aes(label = per_sales_urban), position = position_dodge(0.9),size=2,vjust = 0) + 
  labs(title = "Percentage of stores with different levels of sales according to the area", x ="Sales category", y = "Percent") +
  theme(plot.title=element_text(size=11))

Puesto que hay más tiendas en zona urbana que en zona rural no analizo las cantidades si no las proporciones de cada categoría de venta en cada zona.

Casi no hay diferencia en proporciones en ninguna categoría de ventas entre zona urbana y rural.

Las diferencias en proporciones más notables son que proporcionalmente hay más ventas medias en la zona urbana y más ventas altas en la zona rural.

¿Cómo son los clientes en las tiendas con ventas altas en zona rural?

df_highsales_rural <- filter(df, Sales_cat == "altas" & Urban == "No")
lmts <- range(df_highsales_rural$Education,df$Education)

par(mfrow = c(1, 2))
boxplot(df_highsales_rural$Education,ylim=lmts, main="Education with shops with high sales in a rural area",cex.main=0.75)
boxplot(df$Education,ylim=lmts, main="Education for all shops",cex.main=0.75)

La distribución de la educación de los clientes en tiendas con ventas altas y en zona rural es superior, en general, a la distribución de la educación de todos los clientes de todas las tiendas.

lmts <- range(df_highsales_rural$Age,df$Age)

par(mfrow = c(1, 2))
boxplot(df_highsales_rural$Age,ylim=lmts, main="Age with shops with high sales in a rural area",cex.main=0.75)
boxplot(df$Age,ylim=lmts, main="Age for all shops",cex.main=0.75)

Hay más gente joven en las tiendas con ventas altas y zona rural.

¿Cuánta gente más?

print("Proporciones de edad de los clientes de tiendas con ventas altas en zona rural")
## [1] "Proporciones de edad de los clientes de tiendas con ventas altas en zona rural"
prop.table(table(df_highsales_rural$Age_cat)); 
## 
##      25-30      30-35      35-40      40-45      45-65      65-80 
## 0.18181818 0.09090909 0.06060606 0.06060606 0.36363636 0.24242424
print("Proporciones de edad de los clientes para todas las tiendas")
## [1] "Proporciones de edad de los clientes para todas las tiendas"
prop.table(table(df$Age_cat))
## 
##  25-30  30-35  35-40  40-45  45-65  65-80 
## 0.1075 0.0800 0.0700 0.1025 0.3850 0.2550

Hay casi un 8% más de jóvenes en las tiendas con ventas altas en zona rural que en todas las tiendas.

Las tiendas con ventas altas en zona rural tienen una comunidad con más ingresos, un 8% más de jóvenes y más educación.

¿Las tiendas con ventas altas en zona rural sitúan los asientos de los coches en algún estante en particular?

print("Proporciones de estanterías de los asientos de los coches de tiendas con ventas altas en zona rural")
## [1] "Proporciones de estanterías de los asientos de los coches de tiendas con ventas altas en zona rural"
prop.table(table(df_highsales_rural$ShelveLoc));
## 
##       Bad      Good    Medium 
## 0.1212121 0.2424242 0.6363636
print("Proporciones de estanterías de los asientos de los coches para todas las tiendas")
## [1] "Proporciones de estanterías de los asientos de los coches para todas las tiendas"
prop.table(table(df$ShelveLoc));
## 
##    Bad   Good Medium 
## 0.2400 0.2125 0.5475

Tienen proporcionalmente la mitad de asientos de los coches en estantes malos las tiendas con ventas altas en zona rural que todas las tiendas.

¿A más ventas el asiento del coche se encuentra en un mejor estante?

plot(y = df$Sales, x = df$ShelveLoc, main="Sales VS Shelves", ylab="Sales",xlab="Shelves")

A más ventas la localización del estante es mejor.

Análisis de la variable publicidad

Hay más gasto de publicidad en zona rural o zona urbana?

df %>% group_by(Urban) %>% summarise(mean_ads = mean(Advertising))
## # A tibble: 2 × 2
##   Urban mean_ads
##   <fct>    <dbl>
## 1 No        6.20
## 2 Yes       6.82
ggplot(df, aes(x=Urban,y=Advertising)) +
    geom_boxplot() + theme_ipsum() + labs(title = "Investment in advertising distribution by area", x ="Urban", y = "Advertising")

summary(filter(df, Urban== "No")$Income)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   40.25   67.00   67.02   90.00  120.00
summary(filter(df, Urban== "Yes")$Income)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   21.00   44.00   70.00   69.34   91.00  120.00

La distribución de la publicidad en la zona urbana es algo superior.

¿A más publicidad más ventas?

plot(y = df$Sales, x = df$Advertising, main="Sales VS Advertising", ylab="Sales",xlab="Advertising", col = alpha("black", 0.5), pch = 19)

No existe correlación entre ventas y publicidad.

¿A mayor precio más inversión en publicidad?

plot(y = df$Advertising, x = df$Sales, main="Sales VS Advertising", ylab="Advertising",xlab="Sales", col = alpha("black", 0.5), pch = 19)

Hay una ligera correlación positiva a más publicidad más ventas.

¿Hay alguna edad en la que haya una correlación más fuerte entre precio y publicidad?

ggplot(df,aes(x=Advertising, y=Sales, size=Age, color=Age_cat)) +
    geom_point(alpha=0.5) + theme_ipsum() + scale_color_brewer(palette = "Paired") +
    labs(title = "Advertising VS Sales VS Age")

ggplot(filter(df,Age>=35),aes(x=Advertising, y=Sales, size=Age, color=Age_cat)) +
    geom_point(alpha=0.5) + theme_ipsum() + scale_color_brewer(palette = "Paired") +
    labs(title = "Advertising VS Sales VS Age (greater than 35 years old)")

Hay una correlación entre publicidad y ventas para clientes a partir de 35 años.

¿Los que no invierten en publicidad venden de media lo mismo que el resto?

summary(filter(df,Advertising==0)$Sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   5.032   6.660   6.825   8.488  14.900
summary(filter(df,Advertising>0)$Sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.370   5.853   7.790   7.874   9.762  16.270

Los que invierten en publicidad venden de media $1000 más que el resto.

¿Los que invierten más en publicidad venden asientos de coches dispuestos en mejores estantes?

ggplot(filter(df,Age>=35),aes(x=Advertising, y=Sales, size=ShelveLoc, color=ShelveLoc)) +
    geom_point(alpha=0.5) + theme_ipsum() + scale_color_brewer(palette = "Paired") +
    labs(title = "Advertising VS Sales VS Shelves")
## Warning: Using size for a discrete variable is not advised.

Hay una clara correlación entre ventas más altas y mejor estante y el resto.

No hay correlación entre publicidad y localización del estante.

Análisis de la variable ingresos

¿Hay más ingresos de la comunidad en zonas rurales o urbanas?

ggplot(df, aes(x=Urban,y=Income)) + geom_boxplot() +
    theme_ipsum() + labs(title = "Income distribution by area")

La distribución de los ingresos de las comunidades es similar en zona urbana y zona rural.

La distribución de ingresos por edad y zona

ggplot(df, aes(x=Urban, y=Income, color=Age_cat)) + geom_boxplot() +
    theme_ipsum() + scale_color_brewer(palette = "Paired") +
    labs(title = "Income distribution by area and age")

Para los clientes entre 25-30, 30-35 y 40-45 años la distribución de ingresos es más compacta en zona rural.

Para los clientes entre 35-40 años la distribución de ingresos es superior en zona rural.

Para los clientes entre 45-65 años la distribución de ingresos es inferior en zona rural.

Para los clientes entre 65-80 años la distribución de ingresos es menos compacta en zona rural.

ggplot(df %>% group_by(Age_cat, Urban) %>% summarise(mean_income = mean(Income),.groups='drop'), aes(fill=Urban,x=Age_cat,y=mean_income)) + geom_bar(stat= "identity", position=position_dodge()) + scale_fill_brewer(palette = "Paired") + theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=0.5)) + geom_text(aes(label = round(mean_income,2)), position = position_dodge(0.9),size=2,vjust = 0) + ggtitle("Average income by age range and area") + ylab("Mean Income") + labs(fill = "Urban") + xlab("Age intervals") + theme_ipsum()

Los intervalos con mayor diferencia son de 35-40 y 45-65 años.

Los clientes de 35-40 años en zona rural tienen una media de ingresos superior a los que están en zona urbana.

Los clientes de 45-65 años en zona urbana tienen una media de ingresos superior a los que están en zona rural.

¿En las tiendas con comunidad con más ingresos hay más inversión de publicidad?

plot(x=df$Income, y=df$Advertising, main = "Income VS Advertising", ylab = "Advertising", xlab = "Income", col = alpha("black", 0.5), pch = 19)

No hay una correlación entre ingresos de la comunidad y publicidad.

¿En la tiendas con comunidad con más ingresos el precio de los asientos de coches es más caro?

plot(x=df$Income, y=df$Price, main = "Income VS Price", ylab = "Price", xlab = "Income", col = alpha("black", 0.5), pch = 19)

No hay correlación entre el precio de los car asientos de coches y los ingresos de la comunidad de clientes.

¿En la tiendas con comunidad con más ingresos hay clientes más mayores?

plot(x=df$Income, y=df$Age, main = "Income VS Age", ylab = "Age", xlab = "Income", col = alpha("black", 0.5), pch = 19)

No hay correlación entre el ingreso de la comunidad de clientes y las edades de los clientes.

¿En la tiendas con comunidad con más ingresos hay clientes con más educación?

plot(x=df$Income, y=df$Education, main = "Income VS Education", ylab = "Education", xlab = "Income", col = alpha("black", 0.5), pch = 19)

No hay correlación entre el ingreso de la comunidad de clientes y la educación de los clientes.

¿En la tiendas con comunidad con más ingresos hay tiendas con más ventas?

plot(x=df$Income, y=df$Sales, main = "Income VS Sales", ylab = "Sales", xlab = "Income", col = alpha("black", 0.5), pch = 19)

No hay correlación entre el ingreso de la comunidad de clientes y las ventas.

¿En la tiendas con comunidad con más ingresos la disposición de los asientos de coches en los estantes es mejor?

plot(x=df$Income, y=df$ShelveLoc, main = "Income VS Shelves", ylab = "Shelves", xlab = "Income", col = alpha("black", 0.5), pch = 19)

No hay correlación entre el ingreso de la comunidad de clientes y los estantes en los que se disponen los asientos de coches.

Análisis de la variable edad de los clientes

¿A más edad más educación?

df %>% group_by(Age_cat) %>% summarise(median_edu = median(Education),.groups = 'drop')
## # A tibble: 6 × 2
##   Age_cat median_edu
##   <fct>        <dbl>
## 1 25-30           14
## 2 30-35           14
## 3 35-40           14
## 4 40-45           13
## 5 45-65           13
## 6 65-80           14
print("25-30")
## [1] "25-30"
quantile(filter(df, Age_cat == "25-30")$Education);
##   0%  25%  50%  75% 100% 
##   10   12   14   16   18
print("30-35")
## [1] "30-35"
quantile(filter(df, Age_cat == "30-35")$Education);
##   0%  25%  50%  75% 100% 
##   10   12   14   16   18
print("35-40")
## [1] "35-40"
quantile(filter(df, Age_cat == "35-40")$Education);
##    0%   25%   50%   75%  100% 
## 10.00 11.75 14.00 16.25 18.00
print("40-45")
## [1] "40-45"
quantile(filter(df, Age_cat == "40-45")$Education);
##   0%  25%  50%  75% 100% 
##   10   11   13   16   18
print("45-65")
## [1] "45-65"
quantile(filter(df, Age_cat == "45-65")$Education);
##   0%  25%  50%  75% 100% 
##   10   11   13   16   18
print("65-80")
## [1] "65-80"
quantile(filter(df, Age_cat == "65-80")$Education)
##   0%  25%  50%  75% 100% 
##   10   12   14   16   18

Los clientes de 40-65 años tienen menos educación que el resto de clientes.

Analizo si esta apreciación tiene que ver con estar o no en zona rural.

¿Hay más tiendas con clientes de 40-65 años en zona rural o urbana?

prop.table(table(df$Urban))
## 
##    No   Yes 
## 0.295 0.705
prop.table(table(filter(df, Age >= 40 & Age <= 65)$Urban))
## 
##        No       Yes 
## 0.2828283 0.7171717

Las tiendas con clientes de 40-65 años tienen el mismo porcentaje en zonas rurales y urbanas que el total de tiendas.

¿Hay diferencia de edad de los clientes que compran en zona rural o urbana?

df_age_urban <- df %>% group_by(Age_cat,Urban) %>% summarise(n = n(),.groups='drop')
df_age_urban$per_age_urban <- ifelse(df_age_urban$Urban == "Yes", round(df_age_urban$n/sum(df$Urban == "Yes"),2),round(df_age_urban$n/sum(df$Urban == "No"),2))
ggplot(df_age_urban, aes(fill=Urban,x=Age_cat,y=per_age_urban)) + geom_bar(stat= "identity", position=position_dodge()) + 
  scale_fill_brewer(palette = "Paired") + 
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=0.5)) + 
  geom_text(aes(label = per_age_urban), position = position_dodge(0.9),size=2,vjust = 0) + 
  ggtitle("Percentage of stores with customers of different ages according to the area") + xlab("age") + ylab("percent") + labs(fill = "urban") +
  theme_ipsum() + theme(plot.title=element_text(size=11))

No hay mucha diferencia entre los edades de los clientes en zona urbana y rural.

¿Los clientes más jóvenes viven más en la ciudad que el resto?

Dado que hay un 70% de clientes que viven en la ciudad y un 30% de clientes que viven en el campo es lógico que haya más clientes jóvenes viviendo en la ciudad. Sin embargo, analizo de entre todos los que viven en la ciudad qué porcentaje es joven y de entre todos los que viven en el campo qué porcentaje no es joven.

De los que viven en la ciudad el 10% son jóvenes.

De los que viven en el campo el 14% son jóvenes.

Hay casi el mismo porcentaje de jóvenes que viven en la ciudad y en el campo si contamos a los clientes totales rurales por un lado y a los clientes totales urbanos por otro lado.